終於來到介面的部分囉!
我覺得在介紹什麼是介面之前,可以先來個情境...餐廳
Ken: Waiter,我需要個菜單(介面),來決定我要吃什麼(決定什麼行為或者介面)
Waiter: 沒問題,我們這裡有提供鳳梨蝦球、糖醋排骨...
揪都馬爹~ 為什麼直接聊到了API(Application Programming Interface)呢?
因為我今天就是來講這個 I 的!!!
說實話,一開始看到介面時,我真的一點概念都沒有,覺得這兩個字好抽象,但後來理解後,我才發現這真的只能用介面這兩個字來表示。 但我其實更喜歡說的是行為
在Ruby的類別中,包含著許多方法,而這些方法可以使用三個關鍵字來區分 Public Protected Private
因此介面又可分為公共介面(Public)與私有介面(Private)兩類,而Protected提供的介面則表示"謹慎使用"(就文字意義上)。
回到我一開始的情境關係,餐廳裡面所提供的菜單,指的就是公共介面,而廚房內部的料理過程(或稱細節)就是所謂的私有介面。
公共介面在軟體內,是指一個類別內的方法們,可以讓外部安心使用(或者稱作穩定)
私有介面則是指不給外部做使用(因為不穩定),而是在自己類別內,進行細節處理(比如公共介面內,會需要私有介面內的方法來做數據處理)
一個好的介面,需要可以接受各種訊息,若是指能給特定的類別使用或者只接受特定資料,那麼介面就毫無彈性可言,明顯是嚴重耦合。
換言之,一個好的介面,並不會介意今天收到什麼參數,而是不管什麼參數,都可以執行獲得結果(這句話是不是很像... 鴨子型別啊),如果不熟悉的人,可以看看先前文章的解耦,使用依賴注入,就可以增加方法(介面)的彈性。
當專案成立new出來時,不知道大家都是怎麼決定類別與其關係的,或許都是使用SRP來決定類別,但實際上這遠遠不夠,而是要利用傳遞訊息的關係來發現物件。
這或許有點抽象,在Sandi Metz著作中的例子中表示,有一項需求是客戶需要自行車旅行團,很直覺的想法是有兩個類別可以先建立起來(從文字上看出),客戶與旅行團。
但仔細思考後發現,若是從物件角度去思考時,就有些不太一樣,像是顧客需要旅行團準備好自行車,那麼顧客會跟旅行團確認旅程(確認這個動作就是訊息傳遞)
但旅行團要跟誰確認好自行車準備好了? 是旅行團自己嗎?
絕對不是,因為這違反了SRP!
所以這個時候再多建立一個類別去負責自行車的準備(可能是自行車店之類的)
這時旅行團就知道跟誰確認
簡言之,思考訊息要傳送給誰(誰要使用介面)來決定說有哪些類別的存在。
這樣的思考模式會更像是物件導向(因為重點在於操作訊息或者說是行為展現)
今天就先分享完介面的基礎概念吧! 明天終於可以解釋 鴨子型別 囉~
感謝大家 如有問題,再煩請大家指教!